package com.seafwg.store.controller;

import com.seafwg.store.service.ex.*;
import com.seafwg.store.utils.ResultJson;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.servlet.http.HttpSession;

/**
 * @Author seafwg
 * @Date 2022/3/25 4:42 下午
 * @Version 1.0
 * @description 控制器的基类，统一捕获异常，处理异常体系
 */

public class BaseController {
    // 成功的状态码
    public static final int OK = 200;

    // 封装两个方法：从HttpSession中获取uid和username的方法
    // 获取uid
    protected final Integer getUidFromSession(HttpSession session) {
        // Integer.valueOf()方法把字符转换成数字
        return Integer.valueOf(session.getAttribute("uid").toString());
    }

    // 获取用户名
    protected final String getUsernameFormSession(HttpSession session) {
        return session.getAttribute("username").toString();
    }

    /**
     * @ExceptionHandler注解用于统一处理方法抛出的异常。当我们使用这个注解时，需要定义一个
     * 异常的处理方法，再给这个方法加上@ExceptionHandler注解，这个方法就会处理类中其他方法
     * （被@RequestMapping注解）抛出的异常。@ExceptionHandler注解中可以添加参数，参数是某
     * 个异常类的class，代表这个方法专门处理该类异常。
     * 状态码的说明：
     *  400x: 普通异常
     *  500x: 数据方面异常
     *  600x: 上传文件出现的异常
     */
    @ExceptionHandler({ ServiceException.class, UploadFileException.class }) // spring提供统一处理抛出的异常
    public ResultJson<Void> handleException(Throwable e) {
        ResultJson<Void> result = new ResultJson<>(e);
        if(e instanceof UsernameDuplicateException) {
            result.setStatus(4000);
        } else if(e instanceof UserNotFoundException) {
            result.setStatus(4001);
        } else if(e instanceof PasswordNotMatchException) {
            result.setStatus(4002);
        } else if(e instanceof InsertException) {
            result.setStatus(5000);
        } else if(e instanceof UpdatePasswordException) { // 修改密码数据，库更新异常
            result.setStatus(5001);
        } else if(e instanceof UpdateUserInfoException) { // 更新用户信息，数据库更新异常
            result.setStatus(5002);
        } else if(e instanceof UpdateAvatarException) {
            result.setStatus(5003);
        } else if(e instanceof SelectException) { // 数据库查询异常
            result.setStatus(5004);
        } else if(e instanceof FileEmptyException) { // 文件为空
            result.setStatus(6000);
        } else if(e instanceof FileSizeException) { // 文件大小异常
            result.setStatus(6001);
        } else if(e instanceof FileStateException) { // 文件状态异常
            result.setStatus(6002);
        } else if(e instanceof FileTypeException) { // 文件类型异常
            result.setStatus(6003);
        } else if(e instanceof FileReadWriteIOException) { // 文件读写异常
            result.setStatus(6004);
        } else if(e instanceof AddressCountLimitException) { // 地址超出限制的个数
            result.setStatus(6005);
        }

        return result;

    }
}
